/**
 * Name der Klasse: SettingsDbAdapter 
 * Autor:			Wilfried Karch
 * Datum:	 		2011-10-11
 * Kurzbesch.:		Klasse um die vom User eingestellten Settings zu persistieren. 
 */

package swd09.fhj.hangman;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class SettingsDbAdapter 
{
	public static final String KEY_OPTION = "option";
	public static final String KEY_VALUE = "value";
    public static final String KEY_ID = "_id";

    private static final String TAG = "SettingsDbAdapter";
    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    //Statement zum Erstellen der Datenbank
    private static final String DATABASE_CREATE =
        "create table settings (_id integer primary key autoincrement, "
        + "option text not null, value text not null);";

    private static final String DATABASE_NAME = "data";
    private static final String DATABASE_TABLE = "settings";
    private static final int DATABASE_VERSION = 2;

    private final Context mContext;

    //Klasse um mit der Datenbank zu interagieren
    private static class DatabaseHelper extends SQLiteOpenHelper 
    {
        DatabaseHelper(Context context) 
        {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        //Datenbank erstellen
        @Override
        public void onCreate(SQLiteDatabase db) 
        {
            db.execSQL(DATABASE_CREATE);
            
            ContentValues initialValues = new ContentValues();
            initialValues.put(KEY_OPTION, "rss-feed");
            initialValues.put(KEY_VALUE, "http://rss.orf.at");
            
            db.replace(DATABASE_TABLE, null, initialValues);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
        {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS settings");
            onCreate(db);
        }
    }

    //Konstruktor, welchem der Kontext �bergeben werden muss
    public SettingsDbAdapter(Context ctx) 
    {
        this.mContext = ctx;
    }

    //Funktion zum �ffnen der Datenbank
    public SettingsDbAdapter open() throws SQLException 
    {
        mDbHelper = new DatabaseHelper(mContext);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

  //Funktion zum Schlie�en der Datenbank
    public void close() 
    {
        mDbHelper.close();
    }

    //Funktion um eine Einstellung bestehend aus einer Option und einem Value anzulegen
    public long createSetting(String option, String value) 
    {
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_OPTION, option);
        initialValues.put(KEY_VALUE, value);

        return mDb.insert(DATABASE_TABLE, null, initialValues);
    }

    //Funktion um die Einstellung mit der angegebenen id zu l�schen
    //Liefert true zur�ck, wenn zumindest eine Zeile gel�scht wurde (sonst  false).
    public boolean deleteSetting(long id) 
    {
        return mDb.delete(DATABASE_TABLE, KEY_ID + "=" + id, null) > 0;
    }

    //Liefert einen Cursor f�r alle Settings in der Tabelle settings
    public Cursor fetchAllSettings()
    {
        return mDb.query(DATABASE_TABLE, new String[] {KEY_ID, KEY_OPTION,
                KEY_VALUE}, null, null, null, null, null);
    }

    //Liefert einen Cursor zur�ck der auf der Position des Elementes
    //mit der angegebenen id steht.
    public Cursor fetchSetting(long id) throws SQLException 
    {
        Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_ID,
                    KEY_OPTION, KEY_VALUE}, KEY_ID + "=" + id, null, null, null, null, null);
        
        if (mCursor != null) 
        {
            mCursor.moveToFirst();
        }

        return mCursor;
    }

    //Funktion zum Updaten eines Settings
    //liefert true zur�ck, wenn mindestens eine Zeile ver�ndert wurde (sonst false).
    public boolean updateSetting(long id, String option, String value) 
    {
        ContentValues args = new ContentValues();
        args.put(KEY_OPTION, option);
        args.put(KEY_VALUE, value);

        return mDb.update(DATABASE_TABLE, args, KEY_ID + "=" + id, null) > 0;
    }
}